/**
 * ECMAScript 的 Date 类型参考了 Java 早期版本中的 java.util.Date。为此，Date 类型将日期
 * 保存为自协调世界时（UTC，Universal Time Coordinated）时间 1970 年 1 月 1 日午夜（零时）至今所
 * 经过的毫秒数。
 */
;(function () {
    // 在不给 Date 构造函数传参数的情况下，创建的对象将保存当前日期和时间。要基于其他日期和时
    // 间创建日期对象，必须传入其毫秒表示（UNIX 纪元 1970 年 1 月 1 日午夜之后的毫秒数）。ECMAScript
    // 为此提供了两个辅助方法：Date.parse()和 Date.UTC()。
    let now = new Date()
    console.log(now)    // 2024-11-11T05:55:42.939Z 这个输出没有添加时区信息
})()

/**
 * Date.parse方法接收一个表示日期的字符串参数，尝试将这个字符串转换为表示该日期的毫秒数。
 * ECMA-262 第 5 版定义了 Date.parse()应该支持的日期格式:
 *  “月/日/年”，如"5/23/2019"；
 *  “月名 日, 年”，如"May 23, 2019"；
 *  “周几 月名 日 年 时:分:秒 时区”，如"Tue May 23 2019 00:00:00 GMT-0700"；
 *  ISO 8601 扩展格式“YYYY-MM-DDTHH:mm:ss.sssZ”，如 2019-05-23T00:00:00（只适用于 兼容 ES5 的实现）。
 */
;(function () {
    // Date.parse()方法接收一个表示日期的字符串参数，尝试将这个字符串转换为表示该日期的毫秒数。
    console.log(Date.parse("May 23, 2019"))     // 1558540800000
    let someDate = new Date(Date.parse("May 23, 2019"))
    console.log(someDate)   // 2019-05-22T16:00:00.000Z

    // 如果传给 Date.parse()的字符串并不表示日期，则该方法会返回 NaN。
    console.log(Date.parse("NaN"))


    // 如果直接把表示日期的字符串传给 Date 构造函数，那么 Date 会在后台调用 Date.parse()。
    let someDate1 = new Date("May 23, 2019");
    console.log(someDate1)  // 2019-05-22T16:00:00.000Z
})()

/**
 * Date.UTC()方法也返回日期的毫秒表示，但使用的是跟 Date.parse()不同的信息来生成这个值。
 * 传给 Date.UTC()的参数是年、零起点月数（1 月是 0，2 月是 1，以此类推）、日（1~31）、时（0~23）、分、秒和毫秒。
 * 这些参数中，只有前两个（年和月）是必需的。如果不提供日，那么默认为 1 日。其他参数的默认值都是 0。
 */
;(function () {
    // GMT 时间 2000 年 1 月 1 日零点
    let y2k = new Date(Date.UTC(2000, 0))
    // 本地时间 2000 年 1 月 1 日零点
    let y2k1 = new Date(2000, 0)
    console.log(y2k)    // 2000-01-01T00:00:00.000Z
    console.log(y2k1)    // Sat Jan 01 2000 00:00:00 GMT+0800 (中国标准时间)

    // GMT 时间 2005 年 5 月 5 日下午 5 点 55 分 55 秒
    let allFives = new Date(Date.UTC(2005, 4, 5, 17, 55, 56))
    // 本地时间 2005 年 5 月 5 日下午 5 点 55 分 55 秒
    let allFives1 = new Date(2005, 4, 5, 17, 55, 55);
    console.log(allFives)   // 2005-05-05T17:55:56.000Z
    console.log(allFives1)   // 2005-05-05T09:55:55.000Z
})()

;(function () {
    let y2k = new Date(Date.UTC(2024, 10, 11, 14, 31, 0))
    let y2k1 = new Date(2024, 10, 11, 14, 31, 0)
    console.log(y2k)    // 2024-11-11T14:31:00.000Z
    console.log(y2k1)   // 2024-11-11T06:31:00.000Z
    // 如果你的本地时区与 UTC 时间相差 8 小时，那么当你传入 14 点时，创建的日期对象在转换为 UTC 时间时会减去本地时区与 UTC 的时差，所以输出结果为 2024-11-11T06:31:00.000Z。
})()
